<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>闭包</title>
	</head>
	<body>
		<button onclick="add()">点击了<span id="sp1">0</span></button>
		<script>
			//js作用域链
			function a1 () {
				var num1 = 100;
				function aa1 () {
					var num2 = 666;
					console.log(num1);
				}
				aa1();
			}
			a1()
			//让作用域链外部的可以使用 内部的数据 而且避免全局污染 就使用闭包
			// console.log(num2);
			
			//闭包的形式1
			//当一个嵌套内部的函数引用了外部的变量，就产生了闭包
			function aa () {
				var num = 0;
				return function () {
					return num++;
				}
			}
			let c = aa();
			function add() {
				document.getElementById("sp1").innerText = c();
			}
			//闭包形式2 将函数作为实参传递给另一个函数调用
			var timer;
			function showDelay (msg,time) {
				timer = setTimeout(function(){
					alert(msg)
				},time)
			}
			showDelay("学习js",2000);
			//闭包的作用延长数据存活的周期 让函数外部可以操作函数内部的数据
			
			//闭包的问题
			//函数执行完毕之后，内存没有释放导致内存泄漏 长个时间使用内存占用量大
			//意外的全局变量
			
			//解决方式 销毁内存引用
			//及时清理计时器等回调函数
			
			//作业1 将云博客项目成功运行起来 录屏或者截图
			//作业2 将index1到index19练习一遍 自己打出来
			
			let arr = [123,2,4,51,5,643];
			console.log(arr.reduce((sum,item)=>sum+=item,0));
		</script>
	</body>
</html>